package org.aplombh.java.awcing.basic.struct.disjointSetUnion;

import java.util.Scanner;

/**
 * 一共有 n 个数，编号是 1∼n，最开始每个数各自在一个集合中。
 * <p>
 * 现在要进行 m 个操作，操作共有两种：
 * <p>
 * M a b，将编号为 a 和 b 的两个数所在的集合合并，如果两个数已经在同一个集合中，则忽略这个操作；
 * Q a b，询问编号为 a 和 b 的两个数是否在同一个集合中；
 * 输入格式
 * 第一行输入整数 n 和 m。
 * <p>
 * 接下来 m 行，每行包含一个操作指令，指令为 M a b 或 Q a b 中的一种。
 * <p>
 * 输出格式
 * 对于每个询问指令 Q a b，都要输出一个结果，如果 a 和 b 在同一集合内，则输出 Yes，否则输出 No。
 * <p>
 * 每个结果占一行。
 * <p>
 * 数据范围
 * 1≤n,m≤105
 * 输入样例：
 * 4 5
 * M 1 2
 * M 3 4
 * Q 1 2
 * Q 1 3
 * Q 3 4
 * 输出样例：
 * Yes
 * No
 * Yes
 */
public class MergeCollection_836 {

    private static final int N = 100010;
    public static int[] p = new int[N];

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        for (int i = 0; i < n; i++) {
            p[i] = i;
        }

        while (m-- != 0) {
            String op = scanner.next();
            int a = scanner.nextInt();
            int b = scanner.nextInt();

            // 将 a 加入到 b 所在集合
            // Add a to the set of b
            if (op.charAt(0) == 'M')
                p[find(a)] = find(b);
            else {
                if (find(a) == find(b)) System.out.println("Yes");
                else System.out.println("No");
            }
        }
    }

    static int find(int x) {
        // 如果 p[x] != x 说明有它与别人共同属于同一个集合, 递归寻找 p[x] = x 的记录
        // if p[x]! = x indicates that it and others belong to the same set, recursively looking for p[x] = x records
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }
}
